From: Ross Lagerwall Date: Wed, 6 Apr 2016 19:15:01 +0000 (-0400) Subject: xsplice: Prevent duplicate payloads from being loaded. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~1185 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=a946b8de1490d23502f762fcccd34e13135cf10e;p=xen.git xsplice: Prevent duplicate payloads from being loaded. Signed-off-by: Ross Lagerwall Signed-off-by: Konrad Rzeszutek Wilk Reviewed-by: Andrew Cooper Reviewed-by: Jan Beulich Release-acked-by: Wei Liu --- diff --git a/xen/common/xsplice.c b/xen/common/xsplice.c index 4b73b97213..1b67d391c5 100644 --- a/xen/common/xsplice.c +++ b/xen/common/xsplice.c @@ -518,6 +518,8 @@ static int prepare_payload(struct payload *payload, sec = xsplice_elf_sec_by_name(elf, ELF_BUILD_ID_NOTE); if ( sec ) { + const struct payload *data; + n = sec->load_addr; if ( sec->sec->sh_size <= sizeof(*n) ) @@ -529,6 +531,20 @@ static int prepare_payload(struct payload *payload, if ( !payload->id.len || !payload->id.p ) return -EINVAL; + + /* Make sure it is not a duplicate. */ + list_for_each_entry ( data, &payload_list, list ) + { + /* No way _this_ payload is on the list. */ + ASSERT(data != payload); + if ( data->id.len == payload->id.len && + !memcmp(data->id.p, payload->id.p, data->id.len) ) + { + dprintk(XENLOG_DEBUG, XSPLICE "%s: Already loaded as %s!\n", + elf->name, data->name); + return -EEXIST; + } + } } sec = xsplice_elf_sec_by_name(elf, ELF_XSPLICE_DEPENDS);